//
//  HHPService.h
//  HHPLiveVideo
//
//  Created by 韩红坡 on 2016/12/16.
//  Copyright © 2016年 韩红坡. All rights reserved.
//
//  封装了网络接口调用，在HHPHTTPRequest模块的基础上扩展了业务相关功能
//  会对接口数据进行验证。所以接口返回的数据必须遵守以下规范：
//
//  对于success的情况：
//    {
//        code = 0;
//        data =     {
//            response = {
//                
//            };
//        };
//        msg = "成功";
//        showMsg = "成功";
//    }
//
//  对于error的情况：
//    {
//        code = 1003;
//        data =     {
//            response = {
//
//            };
//        };
//        msg = "失败";
//        showMsg = "失败";
//    }//
//   错误处理：
//     当服务端返回error(code != 0)时，自动将请求返回内容包装为NSError
//     此时error的domain为HHPServiceErrorDomain，code和message和服务端返回的json中的相同
//
//     如果出现了其他类型的错误，会自动将error包装为新的NSError
//     此时error的domain为HHPServiceNetworkErrorDomain，code属性没有意义，message属性可以直接显示给用户
//     原来的error会存储在error.userInfo的HHPServiceOriginalErrorKey中
//
//   response解析：
//     自动提取response中的内容。在成功回调中接收到的object，就是response属性的值
//
//     如果response的值是复杂对象（数组或字典），可以将其中的内容解析为model

#import <HHPHTTPRequestManager.h>

// 网络错误，错误信息可以直接提示用户
#define HHPServiceNetworkErrorDomain @"HHPServiceNetworkErrorDomain"

// 服务端错误（code!=0）
#ifndef HHPServiceErrorDomain
#define HHPServiceErrorDomain @"HHPServiceError"
#endif

// json验证失败，不能将错误信息显示给用户
#define HHPServiceParseErrorDomain @"HHPServiceParseErrorDomain"

// 原始的错误信息
#define HHPServiceOriginalErrorKey @"HHPServiceOriginalErrorKey"

typedef NS_ENUM(NSInteger, HHPHTTPDataHandlerType) {
    HHPHTTPDataHandlerTypeAny,
    HHPHTTPDataHandlerTypeDictionary,
    HHPHTTPDataHandlerTypeArray,
    HHPHTTPDataHandlerTypeString,
    HHPHTTPDataHandlerTypeNumber
};

/**
 使用自定义的block解析返回内容
 */
@interface HHPHTTPBlockDataHander : NSObject <HHPHTTPDataHandlerProtocol>

+ (instancetype)dataHandlerWithBlock:(id (^)(id data, NSURLSessionTask *task))block;

@end

/**
 解析符合新API规范的返回内容
 */
@interface HHPHTTPDataHandler : NSObject <HHPHTTPDataHandlerProtocol>

+ (instancetype)dataHandlerWithType:(HHPHTTPDataHandlerType)type modelClass:(Class)modelClass;
- (instancetype)initWithType:(HHPHTTPDataHandlerType)type modelClass:(Class)modelClass;

@end

@interface HHPServiceErrorHandler : NSObject <HHPHTTPErrorHandlerProtocol>

@end

@interface HHPHTTPEncryptHandler : NSObject <HHPHTTPEncryptHandlerProtocol>

@end

@interface HHPHTTPRequestManager (AutoLoad)

@end
